package com.hspedu.encap;

public class Encapsulation01 {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("jac3333k");
        person.setAge(200);
        person.setSalary(5000.1);
        System.out.println(person.info());
        System.out.println("======================");
        System.out.println(person.toString());

        //如果直接使用构有参造器来给属性赋值，
        Person person1 = new Person("smith", 2000,50000.0);
        System.out.println("======smith信息==========");

    }
}

/**
 * 那么在java中如何实现这种类似的控制呢?
 * 请大家看一个小程序(com.hspedu.encap: Encapsulation01.java),
 * 不能随便查看人的年龄,工资等隐私，并对设置的年龄进行合理的验证。年龄合理就设置，否则给默认
 * 年龄, 必须在 1-120, 年龄， 工资不能直接查看 ， name的长度在 2-6字符 之间
 */

/**
 * 对一个类封装，就是将其属性设置为private，使其不能被直接修改，然后对外提供get和set方法
 */
class Person{
    public String name;//姓名公开
    private int age;//年龄私有化
    private double salary;//工资私有化

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name.length()>=2 && name.length()<=6){
            this.name = name;
        }else {
            System.out.println("名字长度必须在 2-6字符 之间");
        }

    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        //在set方法里面添加判断；但是一般开发时，会在业务逻辑中添加判断
        if (age >= 1 && age <= 120){
            this.age = age;
        }else {
            System.out.println("设置的年龄不对，年龄必须1-120岁之间");
            this.age = 18;
        }

    }

    public double getSalary() {
        //可以对当前对象的权限判断
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public Person() {
    }

    //有三个属性的构造器
    public Person(String name, int age, double salary) {
//        this.name = name;
//        this.age = age;
//        this.salary = salary;
        //可以将set方法写在构造器中，也可以验证
        setName(name);
        setAge(age);
        setSalary(salary);
    }

    //可以自己写访问全部属性的方法，也可以使用快捷键Generate生成 重写的toString()方法
    public String info(){
        return "信息为：name = " + getName() + ", age=" + age + ", salary=" + salary;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                '}';
    }
}